package com.xhcl.system.service.impl;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.alibaba.fastjson.JSON;
import com.xhcl.system.mapper.TSrhsBkpztiMapper;
import com.xhcl.system.mapper.TSrhsBkpztoMapper;
import com.xhcl.system.domain.TSrhsBkpzti;
import com.xhcl.system.domain.TSrhsBkpzto;
import com.xhcl.system.domain.TSrhsZfpzti;
import com.xhcl.system.domain.TSrhsBkpzto;
import com.xhcl.system.domain.TSrhsZfpzto;
import com.xhcl.system.service.ITSrhsBkpztoService;
import com.xhcl.system.service.ITSrhsHsxtcsService;
import com.xhcl.common.core.text.Convert;
import com.xhcl.common.exception.BusinessException;

/**
 * 拨款凭证头Service业务层处理
 * 
 * @author xhcl
 * @date 2020-09-09
 */
@Service
public class TSrhsBkpztoServiceImpl implements ITSrhsBkpztoService 
{
    @Autowired
    private TSrhsBkpztoMapper tSrhsBkpztoMapper;
    
    @Autowired
    private TSrhsBkpztiMapper tSrhsBkpztiMapper;
    
    
    @Autowired
    private ITSrhsHsxtcsService tSrhsHsxtcsService;

    /**
     * 查询拨款凭证头
     * 
     * @param bktxh 拨款凭证头ID
     * @return 拨款凭证头
     */
    @Override
    public TSrhsBkpzto selectTSrhsBkpztoById(Long bktxh)
    {
        return tSrhsBkpztoMapper.selectTSrhsBkpztoById(bktxh);
    }

    /**
     * 查询拨款凭证头列表
     * 
     * @param tSrhsBkpzto 拨款凭证头
     * @return 拨款凭证头
     */
    @Override
    public List<TSrhsBkpzto> selectTSrhsBkpztoList(TSrhsBkpzto tSrhsBkpzto)
    {
        return tSrhsBkpztoMapper.selectTSrhsBkpztoList(tSrhsBkpzto);
    }

    /**
     * 新增拨款凭证头
     * 
     * @param tSrhsBkpzto 拨款凭证头
     * @return 结果
     */
    @Override
    @Transactional
    public int insertTSrhsBkpzto(TSrhsBkpzto tSrhsBkpzto,String username) throws BusinessException
    {   
    	Long bkxh=tSrhsBkpztoMapper.selectTSrhsBkpztoBkxh();
    	//kjkmmc
    	if (tSrhsBkpzto==null){
    		throw new BusinessException("拨款信息为空！");
    	}
    	//kjkmmc
    	if (tSrhsBkpzto.getParams().get("bkpzti")==null){
    		throw new BusinessException("拨款单位为空！");
    	}
    	
    	List<TSrhsBkpzti> list=JSON.parseArray(tSrhsBkpzto.getParams().get("bkpzti").toString(),TSrhsBkpzti.class);
    	
    	BigDecimal zje=new BigDecimal("0");
    	for (TSrhsBkpzti zfti:list){
    		zje=zje.add(zfti.getJe());
    	}
    	tSrhsBkpzto.setZje(zje);
    	tSrhsBkpzto.setBktxh(bkxh);
    	tSrhsBkpzto.setShbz(0L);
    	tSrhsBkpzto.setDybz(0L);
    	tSrhsBkpzto.setZd(username);
        int intRow=tSrhsBkpztoMapper.insertTSrhsBkpzto(tSrhsBkpzto);
    	
    	Long i=1L;
    	for (TSrhsBkpzti zfti:list){
    		zfti.setXh(i);
    		zfti.setBktxh(bkxh);
    		if (tSrhsBkpzto.getParams().get("ysgllx")!=null){
    		  if (tSrhsBkpzto.getParams().get("ysgllx").equals("0")){
    			  zfti.setYsgllx("基本支出");
    		  } else if (tSrhsBkpzto.getParams().get("ysgllx").equals("1")){
    			  zfti.setYsgllx("项目支出");
    		  }
    		}
    		if (tSrhsBkpzto.getBklx().equals(1L) || tSrhsBkpzto.getBklx().equals(2L))
    		{
    			zfti.setJfkmdm(zfti.getYskm());
    			zfti.setJfkmmc(zfti.getYskmmc());
    			zfti.setYskm("");
    			zfti.setYskmmc("");
    		}
    		zfti.setYsgllx(tSrhsBkpzto.getParams().get("ysgllx")==null?"":tSrhsBkpzto.getParams().get("ysgllx").toString());
    		zfti.setZckmdm(tSrhsBkpzto.getParams().get("gnkmdm")==null?"":tSrhsBkpzto.getParams().get("gnkmdm").toString());
    		zfti.setZckmmc(tSrhsBkpzto.getParams().get("gnkmmc")==null?"":tSrhsBkpzto.getParams().get("gnkmmc").toString());
    		i++;
    		tSrhsBkpztiMapper.insertTSrhsBkpzti(zfti);
    	}
    	if (tSrhsBkpzto.getBklx().equals(0L) || tSrhsBkpzto.getBklx().equals(4L)){
    		tSrhsBkpztiMapper.updateTSrhsBkpztiforjfkmdm(bkxh);
    	}
    	tSrhsBkpztiMapper.updateTSrhsBkpztifordfkmdm(bkxh);
    	return intRow;
    }

    /**
     * 修改拨款凭证头
     * 
     * @param tSrhsBkpzto 拨款凭证头
     * @return 结果
     */
    @Override
    @Transactional
    public int updateTSrhsBkpzto(TSrhsBkpzto tSrhsBkpzto,String username) throws  BusinessException
    {   
    
    	if (tSrhsBkpztoMapper.selectTSrhsBkpztoIsVerify(tSrhsBkpzto.getBktxh())>0){
    		throw new BusinessException("已审核不能修改！"); 
    	}
    	//kjkmmc
    	if (tSrhsBkpzto==null){
    		throw new BusinessException("拨款信息为空！");
    	}
    	//kjkmmc
    	if (tSrhsBkpzto.getParams().get("bkpzti")==null){
    		throw new BusinessException("拨款单位为空！");
    	}
    	
    	tSrhsBkpztiMapper.deleteTSrhsBkpztiById(tSrhsBkpzto.getBktxh());
        tSrhsBkpztoMapper.deleteTSrhsBkpztoById(tSrhsBkpzto.getBktxh());
        Long bkxh=tSrhsBkpztoMapper.selectTSrhsBkpztoBkxh();
    	
    	List<TSrhsBkpzti> list=JSON.parseArray(tSrhsBkpzto.getParams().get("bkpzti").toString(),TSrhsBkpzti.class);
    	
    	BigDecimal zje=new BigDecimal("0");
    	for (TSrhsBkpzti zfti:list){
    		zje=zje.add(zfti.getJe());
    	}
    	tSrhsBkpzto.setZje(zje);
    	tSrhsBkpzto.setBktxh(bkxh);
    	tSrhsBkpzto.setShbz(0L);
    	tSrhsBkpzto.setDybz(0L);
    	tSrhsBkpzto.setZd(username);
        int intRow=tSrhsBkpztoMapper.insertTSrhsBkpzto(tSrhsBkpzto);
    	
    	Long i=1L;
    	for (TSrhsBkpzti zfti:list){
    		zfti.setXh(i);
    		zfti.setBktxh(bkxh);
    		if (tSrhsBkpzto.getParams().get("ysgllx")!=null){
      		  if (tSrhsBkpzto.getParams().get("ysgllx").equals("0")){
      			  zfti.setYsgllx("基本支出");
      		  } else if (tSrhsBkpzto.getParams().get("ysgllx").equals("1")){
      			  zfti.setYsgllx("项目支出");
      		  }
      		}
    		if (tSrhsBkpzto.getBklx().equals(1L) || tSrhsBkpzto.getBklx().equals(2L))
    		{
    			zfti.setJfkmdm(zfti.getYskm());
    			zfti.setJfkmmc(zfti.getYskmmc());
    			zfti.setYskm("");
    			zfti.setYskmmc("");
    		}
    		zfti.setZckmdm(tSrhsBkpzto.getParams().get("gnkmdm")==null?"":tSrhsBkpzto.getParams().get("gnkmdm").toString());
    		zfti.setZckmmc(tSrhsBkpzto.getParams().get("gnkmmc")==null?"":tSrhsBkpzto.getParams().get("gnkmmc").toString());
    		i++;
    		tSrhsBkpztiMapper.insertTSrhsBkpzti(zfti);
    	}
    	if (tSrhsBkpzto.getBklx().equals(0L) || tSrhsBkpzto.getBklx().equals(4L)){
    	tSrhsBkpztiMapper.updateTSrhsBkpztiforjfkmdm(tSrhsBkpzto.getBktxh());
    	}
    	tSrhsBkpztiMapper.updateTSrhsBkpztifordfkmdm(tSrhsBkpzto.getBktxh());
    	return intRow;
    }
    /**
     * 删除拨款凭证头对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteTSrhsBkpztoByIds(String ids) throws  BusinessException
    {   String[] bktxhs=Convert.toStrArray(ids);
        for (int i=0;i<bktxhs.length;i++){
	    	if (tSrhsBkpztoMapper.selectTSrhsBkpztoIsVerify(Long.valueOf(bktxhs[i]))>0){
	    		throw new BusinessException("已审核不能删除！"); 
	    	}
        }
    	tSrhsBkpztiMapper.deleteTSrhsBkpztiByIds(bktxhs);
        return tSrhsBkpztoMapper.deleteTSrhsBkpztoByIds(bktxhs);
    }

    /**
     * 删除拨款凭证头信息
     * 
     * @param bktxh 拨款凭证头ID
     * @return 结果
     */
    @Override
    @Transactional
    public int deleteTSrhsBkpztoById(Long bktxh) throws  BusinessException
    {   
    	if (tSrhsBkpztoMapper.selectTSrhsBkpztoIsVerify(bktxh)>0){
    		throw new BusinessException("已审核不能删除！"); 
    	}
    	tSrhsBkpztiMapper.deleteTSrhsBkpztiById(bktxh);
        return tSrhsBkpztoMapper.deleteTSrhsBkpztoById(bktxh);
    }
    
    /**
     * 审核凭证
     */
    @Transactional
    public void verifyTSrhsBkpztoById(String ids,String userName) throws BusinessException
    
    {   String[] zfxhs=Convert.toStrArray(ids);
        for( int i=0;i<zfxhs.length;i++){
        	if (tSrhsBkpztoMapper.selectTSrhsBkpztoIsVerify(Long.valueOf(zfxhs[i]))>0){
        		throw new BusinessException("存在已审核记录不能再审核！"); 
        	}
        }
    	String ifone=tSrhsHsxtcsService.getHsxtcsnr("ifone");
    	for( int i=0;i<zfxhs.length;i++){
    		
    		 TSrhsBkpzto pkto=tSrhsBkpztoMapper.selectTSrhsBkpztoById(Long.valueOf(zfxhs[i]));
	    	 if (pkto!=null && pkto.getZd()!=null){
	    		 if ((ifone != null) && (ifone.equals("0")) && (pkto.getZd().equals(userName))) {
					 throw new BusinessException("制单与审核不能是同一人");
				 }
	    	 }
    	}
        tSrhsBkpztoMapper.updateTSrhsBkpztoByIds(userName,zfxhs);
    	Map<String,Object> map=new HashMap<String,Object>();
    	map.put("bkxhs", ids);
    	map.put("sh", userName);
    	tSrhsBkpztoMapper.callBkpzVerify(map);
        if (map.get("outrev")!=null && !map.get("outrev").toString().equals("ok")){
        	throw new BusinessException(map.get("outrev").toString()); 
        }
    }
    
    public void BkpzCancel(TSrhsBkpzto tSrhsBkpzto) throws BusinessException
    {   
    	if (tSrhsBkpztoMapper.selectTSrhsBkpztoIsVerify(tSrhsBkpzto.getBktxh())==0){
    		throw new BusinessException("此记录未审核记录不能再撤销！"); 
    	}
    	Map<String,Object> map=new HashMap<String,Object>();
    	map.put("pztxh", tSrhsBkpzto.getPztxh()); 
    	tSrhsBkpztoMapper.callBkpzCancel(map);
        if (map.get("outrev")!=null && !map.get("outrev").toString().equals("ok")){
        	throw new BusinessException(map.get("outrev").toString()); 
        }
    }
}
